咦,所以一級物件不是第一層的物件,不是「一等公民、次等公民」這種意思,而是程式設計領域裡面的某個歷史悠久的特定詞彙,定義為:
"an entity that can be constructed at run-time, passed as a parameter, returned from a subroutine, or assigned into a variable." http://en.wikipedia.org/wiki/First-class_citizen
這幾個都是同義字: "first-class citizen", "first-class object", "first-class entity", "first-class value" 。
jQuery in Action 第二版的中譯,譯為「一級公民」「一級物件」。在中文版的維基百科上則寫做「第一類公民」「第一類物件」。
一級物件、一級公民,就是指它們不會被當作二級物件、二等公民看待啦!在物件導向的社會,物件就是老大,就是一級公民,其它不是物件都是二等公民 .... XD
學JS first-class object常聽到,講到function就會出現,不過我也常在想,那是有second-class object這種東西嗎 XD ,如果有一等公民,那其他的是次等公民還是賤民階級呢......完全是亂想一通
比方說,Java中的方法不是物件,就只能當個次級公民,在地上看著那些可以天上飛來飛去的物件(方法指著天上告訴陳述句說:聽說那些會飛的都戴著一等公民證)...XD
以下雖然是用Java解說,不過對JavaScript也適用:
我們沒什麼不同
Call by value?
我是都用戴名牌來比喻...
Java 一樣是 reference 的機制
不像C++, 會明顯區分 point 還是 object, 雖然C++裡也有 ref 關鍵字
所以當C++沒寫好時, 常發生一堆問題(像是記憶體泄漏, 或是記憶體違規存取...)
為了看懂你的文章跟圖解,只好先去 Google 這個! XDDD
http://bone.twbbs.org.tw/blog/programming_2012-04-16-candjavamemory.rst.html
然後終於知道 stack 跟 heap 是什麼了!XD
沒寫過其他語言,不曉得您文章中說的 C++ 的 call by reference 是什麼情況,我想請問... call by reference 和 call by value 中譯就是所謂的「傳值」跟「傳址」嗎?是不是 Java 跟 JavaScript 都是只有 call by value 呢?(歪頭)
C++ 的 call by reference一般成「傳參考」,call by value一般譯成「傳值」。
Java都是傳值,JavaScript幾乎是傳值(嗯...我知道有個地方是傳參考...XD)
なに?!在哪裡在哪裡?∫OoO∫
啊,我又有個問題,既然 JavaScript 裡面的 variables 全都是 global object (比方說 window )的屬性的話,那... 不就表示它們全都得跟著 global object 一起放在 heap segment 裡面?!∫OoO∫
なに?!在哪裡在哪裡?∫OoO∫
arguments...
既然 JavaScript 裡面的 variables 全都是 global object...
物件才是放在heap,變數不是..
primitive values不是物件, 有人就用"第二級物件"來表示. 在大部分語言中, functions不是物件, JavaScript稱之為物件, 這只是functional programming對function的另一種定義, JVM上的scala可以定義function, Java 8的Lambda也要引入functional programming的語法, 但是, 這是語法, 不該以第一級物件來混淆.只是這樣的定義容易讓物件導向失焦, 我的看法很簡單, 別陷在名詞定義中. 要學清楚物件導向語言的真實意義.
我翻了翻JavaScript The Definitive Guide 6e, 試圖去理解JavaScript對Object的定義: Any value in JavaScript that is not a string, a number, true, false, null, or undefined
is an object.
也就是說, 除了 primitive values和不存在與無所知的"東西"之外, 都是"Object", 這個Object看起來是包山包海, 又自稱是Dynamic Objects, 可以隨時變形, 看來, 應該稱之為"東西", 唉, 這只是JavaScript的語法, 並非物件導向語言中的物件. 暈了.
所以, 千萬別把JavaScript的"東西"或"語法"拿來解釋物件導向的物件. 圖中謬誤, 真是慘不忍睹. 不知板主的用意是?
除了稱之為"東西"之外, 或許可以稱為"值物件", 如同書上的定義, any value..., JavaScript看function時, 看到的是"值".
JavaScript向來就是把function稱作是一級的物件(這也不是樓主所創,google一下「JavaScript first class object」就會有許多相關的見解),不知道bizpro大大對於這樣的「名詞定義」有什覺得不妥的地方?把JS的物件改稱作「東西」或「值物件」好像也沒更容易溝通。
不過話說回來,舉繼承為例,真正用JavaScript的prototype機制來做的也沒多少,大家也是想盡辦法去模擬class based的作法,而不是用原汁原味的JS作法,這也算是另一種世界觀強行進入JS的開發模式,而JavaScript剛好有那樣的彈性可以應付,造成許多不同的觀念都混雜在一起。